package com.hddf.project.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

public class UploadService {

	private static UploadService us = null;

	static {
		if (null == us) {
			us = new UploadService();
		}
	}

	public static UploadService getInService() {
		return us;
	}

	/**
	 * 上传文件
	 * 
	 * @param fileName
	 *            上传的文件名
	 * @param fileData
	 *            上传的文件
	 * @param type
	 *            上传的文件类别
	 * @param path
	 *            上传的文件保存路径
	 * @return
	 * @throws Exception
	 */
	public boolean saveFiles(String path, String fileName, String fileData) throws Exception {
		FileInputStream fis = new FileInputStream(fileData);// 获取文件
		File file = new File(path);
		boolean tof = file.exists();
		if (!tof) {
			tof = file.mkdirs();
			if (!tof) {
				System.err.println("文件夹创建失败，请确认磁盘没有写保护并且空件足够以及path：【" + path + "】的有效性");
			}
		}
		FileOutputStream fos = new FileOutputStream(file + "/" + fileName);
		byte[] b = new byte[1024];
		int length;
		while ((length = fis.read(b)) > 0) {
			fos.write(b, 0, length);
		}
		fis.close();
		fos.close();
		return true;
	}

	/**
	 * 上传文件
	 * 
	 * @param fileName
	 *            上传的文件名
	 * @param fileData
	 *            上传的文件
	 * @param type
	 *            上传的文件类别
	 * @param path
	 *            上传的文件保存路径
	 * @return
	 * @throws Exception
	 */
	public boolean saveFiles(String path, String fileName, File fileData) {
		try {
			FileInputStream fis = new FileInputStream(fileData);// 获取文件
			File file = new File(path);
			boolean tof = file.exists();
			if (!tof) {
				// System.out.println("创建文件夹");
				// file.mkdirs();
				tof = file.mkdirs();
				if (!tof) {
					System.err.println("文件夹创建失败，请确认磁盘没有写保护并且空件足够以及path：【" + path + "】的有效性");
				}
			}
			FileOutputStream fos = new FileOutputStream(file + "/" + fileName);
			byte[] b = new byte[1024];
			int length;
			while ((length = fis.read(b)) > 0) {
				fos.write(b, 0, length);
			}
			fis.close();
			fos.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 修改文件夹名称
	 * 
	 * @param oldPath
	 * @param pathName
	 *            目标名称
	 * @return
	 */
	public boolean updateFileName(String oldPath, String pathName) {
		File oldFile = new File(oldPath);
		String oldFileP = oldFile.getParent();
		String newPath = oldFileP + "/" + pathName;
		File newFile = new File(newPath);
		if (oldFile.renameTo(newFile)) {
			return true;
		}
		return false;
	}

	/**
	 * 删除文件夹
	 * 
	 * @param folderPath
	 *            文件夹完整绝对路径
	 */
	public boolean delFolder(String sPath) {
		try {
			boolean flag = false;
			File file = new File(sPath);
			// 判断目录或文件是否存在
			if (!file.exists()) { // 不存在返回 false
				return flag;
			} else {
				// 判断是否为文件
				if (file.isFile()) { // 为文件时调用删除文件方法
					return deleteFile(sPath);
				} else { // 为目录时调用删除目录方法
					return deleteDirectory(sPath);
				}
			}
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 删除目录（文件夹）以及目录下的文件
	 * 
	 * @param sPath
	 *            被删除目录的文件路径
	 * @return 目录删除成功返回true，否则返回false
	 */
	public boolean deleteDirectory(String sPath) {
		// 如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		for (int i = 0; i < files.length; i++) {
			// 删除子文件
			if (files[i].isFile()) {
				flag = deleteFile(files[i].getAbsolutePath());
				if (!flag)
					break;
			} // 删除子目录
			else {
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag)
					break;
			}
		}
		if (!flag)
			return false;
		// 删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 删除文件
	 * 
	 * @param sPath
	 * @return
	 */
	public boolean deleteFile(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			file.delete();
			flag = true;
		}
		return flag;
	}

	/**
	 * 将pdf转换成swf.
	 * 
	 * @param pdfFilePath
	 *            pdf绝对文件路径
	 * @param swfFilePath
	 *            要转换成的swf文件的绝对路径
	 * @return
	 */
	public int pdf2SWF(String pdfFilePath, String swfFilePath) {
		try {
			File inputFile = new File(pdfFilePath);
			if (!inputFile.exists()) {
				return -1;// 找不到源文件, 则返回-1
			}

			// 如果目标路径不存在, 则新建该路径
			File outputFile = new File(swfFilePath);
			if (!outputFile.getParentFile().exists()) {
				outputFile.getParentFile().mkdirs();
			}

			// 启动pdf2swf的服务
			// String command = SWFTools_HOME + "pdf2swf.exe -t " + pdfFilePath
			// + " -o " + swfFilePath + " -T 9";
			String command = "/usr/local/swftools/bin/pdf2swf  -T 9 " + pdfFilePath + " -o " + swfFilePath;// linux系统的命令

			Process pro = Runtime.getRuntime().exec(command);
			pro.waitFor();
			// 关闭pdf2swf服务的进程
			pro.destroy();

			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	/**
	 * 将Office文档转换为PDF. 运行该函数需要用到OpenOffice, OpenOffice下载地址为
	 * http://www.openoffice.org/
	 * 
	 * <pre>
	 * 方法示例:
	 * String sourcePath = "F:\\office\\source.doc";
	 * String destFile = "F:\\pdf\\dest.pdf";
	 * Converter.office2PDF(sourcePath, destFile);
	 * </pre>
	 * 
	 * @param sourceFile
	 *            源文件, 绝对路径. 可以是Office2003-2007全部格式的文档, Office2010的没测试. 包括.doc,
	 *            .docx, .xls, .xlsx, .ppt, .pptx等. 示例: F:\\office\\source.doc
	 * @param destFile
	 *            目标文件. 绝对路径. 示例: F:\\pdf\\dest.pdf
	 * @return 操作成功与否的提示信息. 如果返回 -1, 表示找不到源文件, 或url.properties配置错误; 如果返回 0, 则表示操作成功;
	 *         返回1, 则表示转换失败
	 */
	public int office2PDF(String sourceFile, String destFile) {
		// Process pro = null;
		OpenOfficeConnection connection = null;

		File inputFile = new File(sourceFile);
		if (!inputFile.exists())
			return -1;// 找不到源文件, 则返回-1

		// 如果目标路径不存在, 则新建该路径
		File outputFile = new File(destFile);
		if (!outputFile.getParentFile().exists())
			outputFile.getParentFile().mkdirs();

		// String OpenOffice_HOME = XmlUtil.conf("OPENOFFICEHOME");//
		// 这里是OpenOffice的安装目录,
		// String OpenOffice_HOME = XmlUtil.conf("OPENOFFICEHOME");//
		// 这里是OpenOffice的安装目录,

		// 在我的项目中,为了便于拓展接口,没有直接写成这个样子,但是这样是绝对没问题的
		// 如果从文件中读取的URL地址最后一个字符不是 '\'，则添加'\'

		// if (OpenOffice_HOME.charAt(OpenOffice_HOME.length() - 1) != '\\')
		// OpenOffice_HOME += "\\";

		try {

			// 启动OpenOffice的服务
			// String command = OpenOffice_HOME +
			// "program\\soffice.exe -headless -accept=\"socket,host="
			// + XmlUtil.conf("OPENOFFICEHOMEIP") + ",port=8100;urp;\"";
			// pro = Runtime.getRuntime().exec(command);// 执行启动

			connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);// 进行连接
			connection.connect();// 进行连接

			// convert
			DocumentConverter converter = new OpenOfficeDocumentConverter(connection);// 转换文件
			converter.convert(inputFile, outputFile);// 转换文件

			// 关闭OpenOffice服务的进程
			connection.disconnect();
			// 关闭
			// pro.destroy();
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			// return -1;
		}
		return 1;
	}
}
